#include<iostream>
using namespace std;

struct Map {
    int x, y, arr[3][3], step;
    
    Map() {
        // 构造函数
        step = 0;
    }
}start, target, list[100000];

// 右、下、左、上
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int front=0, rear=-1;
bool v[403200] = {false};

int cantor(int a[], int len) {
    int ans=0;
    for (int i=0; i<len; i++) {
        int count=0, index=1, f=1;
        for (int j=i+1; j<len; j++) {
            if (a[i] > a[j])
                count++;
            f *= index;
            index++;
        }
        ans += count * f;
    }
    return ans;
}

int cantorMap(Map map) {
    int a[9] = {0};
    for (int i=0; i<3; i++)
        for (int j=0; j<3; j++)
            a[3*i+j] = map.arr[i][j];
    return cantor(a, 9);
}

int main() {
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            start.arr[i][j] = temp;
            if (temp == 0) {
                start.x = i;
                start.y = j;
            }
        }
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            target.arr[i][j] = temp;
        }
    int tg = cantorMap(target);
    start.step++;
    // 进队操作
    // ++i，先加后i；i++，先i后加
    list[++rear] = start;
    v[cantorMap(start)] = true;

    while(front <= rear) {
        for(int i=0; i<4; i++) {
            Map map = list[front];
            int xx = map.x + dx[i];
            int yy = map.y + dy[i];
            if (xx>=0 && xx<=2 && yy>=0 && yy<=2) {
                swap(map.arr[xx][yy], map.arr[map.x][map.y]);
                map.x = xx;
                map.y = yy;
                map.step++;

                if(v[cantorMap(map)]) continue;
                if(tg == cantorMap(map)) {
                    cout << map.step;
                    return 0;
                }
                list[++rear] = map;
                v[cantorMap(map)] = true;
            }
        }
        // 出队
        front++;
    }
    return 0;
}
